package com.janwen.spring.trx.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
/**
 * 事务获取的入口
 * @author janwen
 * Aug 22, 2012
 * 对于基于接口动态代理的AOP事务增强来说，由于接口的方法都必然是public的，这就要求实现类的实现方法也必须是public的（不能是protected、private等），同时不能使用static的修饰符。所以，可以实施接口动态代理的方法只能是使用“public”或“public final”修饰符的方法，其他方法不可能被动态代理，相应的也就不能实施AOP增强，换句话说，即不能进行Spring事务增强了。 
    基于CGLib字节码动态代理的方案是通过扩展被增强类，动态创建其子类的方式进行AOP增强植入的。由于使用final、static、private修饰符的方法都不能被子类覆盖，相应的，这些方法将无法实施AOP增强。
 */
@Service("stuffService")
public class StuffService {

	static final String aop_cglib = "AopCGLIBTrx.xml";
	static final String aop_interface = "AopTrx.xml";
	public static void main(String[] args) {
		
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(aop_interface);
		StuffService service = (StuffService) applicationContext.getBean("stuffService");
		service.method1();
		service.method2();
		//service.method3();
		service.method4();
		service.method5();
		//调用protected方法?
		service.method6();
	}
	static final Log logger = LogFactory.getLog(StuffService.class);
	//[DEBUG]	2012-06-13 11:58:09,402	[main]	jdbc.datasource.DataSourceTransactionManager	(AbstractPlatformTransactionManager.java:365)	-Creating new transaction with name [com.qianpin.spring.trx.aop.StuffService.method1]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
	public void method1() {
		logger.info("begin method1");
		logger.info("execute method1");
		logger.info("after method1");
		//method3();
	}

	public static void method2() {
		logger.info("begin method2");
		logger.info("execute method2");
		logger.info("after method2");
	}

	private void method3() {
		logger.info("begin method3");
		logger.info("execute method3");
		logger.info("after method3");
		throw new RuntimeException("exception @method3");
	}

	/**
	 * 
	 * janwen
	 *
	 */
	public static final void method4() {
		logger.info("begin method4");
		logger.info("execute method4");
		logger.info("after method4");
	}

	public final void method5() {
		logger.info("begin method5");
		logger.info("execute method5");
		logger.info("after method5");
	}
//[DEBUG]	2012-06-13 11:58:09,734	[main]	jdbc.datasource.DataSourceTransactionManager	(AbstractPlatformTransactionManager.java:365)	-Creating new transaction with name [com.qianpin.spring.trx.aop.StuffService.method6]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

	protected void method6() {
		logger.info("begin method6");
		logger.info("execute method6");
		logger.info("after method6");
		method3();
	}
}
